iT邦幫忙

2023 iThome 鐵人賽

DAY 19
0
Vue.js

淺談vue3源碼,很淺的那種系列 第 23

[Day 22]總整理

  • 分享至 

  • xImage
  •  

我們來檢驗一下這幾天所學的東西是不是真的好用吧。

先在/src/index.ts寫下以下代碼:

import './assets/css/style.less';
import { render } from './runtime-dom';
import { h } from './runtime-core/h';

document.body.innerHTML = '<div id="app" />';
const app = <HTMLElement>document.querySelector('#app');

render(h('div', { class: 'title' }, 'NMSL!!'), app);

setTimeout(() => {
  render(h('h1', { style: { color: 'red' } }, 'NMSL!!!!'), app);
}, 3000);

並到/src/assets/css/style.less給.title寫一些你喜歡的樣式,然後把專案運行起來看看。

可以看到render將我們用h創建的虛擬dom進行比對,並以最小量更新將舊的內容替換成了新的內容。

甚至我們也能修改代碼如下,與響應式變數結合:

import './assets/css/style.less';
import effect from './vue/effect';
import { ref } from './vue';
import { render } from './runtime-dom';
import { h } from './runtime-core/h';

document.body.innerHTML = '<div id="app" />';
const app = <HTMLElement>document.querySelector('#app');

const msg = ref('nmsl');

effect(() => {
  render(h('div', { class: 'title' }, msg.value), app);
});

setTimeout(() => {
  msg.value = 'NMSL!!';
}, 3000);


可以看到我們將msg.value改成'NMSL!!'後,畫面確實更新了。

甚至我們還能模擬v-for,渲染一個列表:

import './assets/css/style.less';
import effect from './vue/effect';
import { reactive } from './vue';
import { render } from './runtime-dom';
import { h } from './runtime-core/h';

document.body.innerHTML = '<div id="app" />';
const app = <HTMLElement>document.querySelector('#app');

const list = reactive(['我想下班', '我想加薪', '我想休假']);

effect(() => {
  render(h('ul', { class: 'title' }, list.map((item: string) => h('li', { key: item }, item))), app);
});

setTimeout(() => {
  list.push('我想吃便當');
}, 10000);


可以看到我們用F12檢查工具竄改html中dom元素的文本,在數據更新驅動視圖後,被竄改的li標籤的文本並沒有改變。這證明了我們的diff算法確實沒有重新渲染不需要重新渲染的標籤。

雖說只是簡簡單單的替換標籤內容,但vue在底層替我們做了太多太多事。先是effect函數中,我們用render函數將h函數為我們提供的虛擬dom渲染至頁面上,同時由於觸發了響應式變數的get,收集了這個effect。

然後在修改響應式變數時,觸發其set,因此重新調用effect裡面的回調。render函數會去比對新舊節點,並實現最小量更新。這一切的一切看似簡單,但唯有親手復刻過vue,才能體會到vue底層在我們看不到的地方,究竟替我們幹了多少苦力活。

親愛的讀者,請容我提醒你,今天早上為你泡咖啡的店員、中午替你們辦公室倒垃圾的清潔工、晚上開公車的司機大哥,你的人生中有太多太多偉大而不起眼的人,在你的意識之外替你做了太多太多的苦工。我們的生活可以如此舒適,其實並不全是靠我們自己的努力掙來的。

在看這篇文章的你應該和我一樣都是程序員,但你知道嗎,在我來到現在的公司以前,我做的其實是客服。老實說,就算我有時需要加班,現在的工作仍比客服輕鬆太多太多,年薪最左邊的數字也高達客服時期的兩倍。

我並不是想說客服是個爛工作,不如說正好相反。客服也好,餐飲業的師傅也好,不管是哪個行業的勞工,都有著你無法想像的專業,承受著你無法想像的壓力,幹著你無法想像的大事。

所以,請對世界上每一位奮鬥的人獻上敬意。在你眼中看似簡單平凡的每一件事,在底層可能都是經歷了你無法想像的過程,才好不容易成就的奇蹟。


上一篇
[Day 21]h函數
下一篇
[Day 23]ast抽象語法樹 - 1——前置準備
系列文
淺談vue3源碼,很淺的那種31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
艾薇 Ivy
iT邦新手 4 級 ‧ 2023-09-25 00:28:49

謝謝作者這麼幽默……我一邊看教學,一邊把那四個英文大字加兩個驚嘆號NMSL!!唸出來

也謝謝你的肯定。如何,成功把NMSL!!印出來的感覺是不是很感動啊XD

我要留言

立即登入留言